Advanced Presto Query Techniques

Database Tutorials - অ্যাপাচি প্রেস্টো (Apache Presto)
180
180

Presto একটি শক্তিশালী ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন যা বিশাল পরিমাণ ডেটা দ্রুত এবং দক্ষতার সাথে প্রসেস করতে সক্ষম। তবে, আরও উন্নত পারফরম্যান্স এবং জটিল ডেটা বিশ্লেষণের জন্য Presto-এর কিছু অ্যাডভান্সড কোয়েরি কৌশল প্রয়োগ করা যেতে পারে। এই কৌশলগুলি বড় ডেটাসেটের সাথে কাজ করার সময় পারফরম্যান্স উন্নত করতে সহায়তা করে এবং কোয়েরি এক্সিকিউশন আরও দক্ষ করে তোলে।

এখানে কিছু Advanced Presto Query Techniques আলোচনা করা হলো:


১. Complex Joins

Presto তে Joins একটি অত্যন্ত শক্তিশালী কৌশল, তবে বড় ডেটাসেটের সাথে কাজ করার সময় সঠিক Join ব্যবহার করা প্রয়োজন। Presto বিভিন্ন ধরনের Join সাপোর্ট করে, যেমন Inner Join, Left Join, Right Join, Full Join, Cross Join, এবং Semi Join

1.1. Broadcast Join

  • Broadcast Join একটি বিশেষ Join কৌশল যেখানে একটি ছোট টেবিলের সমস্ত ডেটা অন্যান্য টেবিলের উপর Broadcast করা হয়।
  • যদি একটি টেবিল ছোট হয় এবং অন্য টেবিল বড় হয়, তবে Presto সেই ছোট টেবিলকে সমস্ত Worker Node-এ পাঠিয়ে দেয়, এবং বড় টেবিলের সাথে সেখানে Join করে।

কোয়েরি উদাহরণ:

SELECT * 
FROM large_table AS l
JOIN small_table AS s ON l.id = s.id

এটি Presto কে নির্দেশ করবে যে small_table কে broadcast করতে এবং large_table এর সাথে Join করতে।

1.2. Partitioned Join

যখন ডেটার একটি বড় পরিমাণ রয়েছে, তখন Partitioned Join ব্যবহার করা হয়, যা Join অপারেশনকে বিভিন্ন অংশে ভাগ করে এবং সেগুলি আলাদাভাবে প্রসেস করে, যাতে স্কেলেবল পারফরম্যান্স পাওয়া যায়।

কোয়েরি উদাহরণ:

SELECT * 
FROM large_table l
JOIN partitioned_table p ON l.partition_key = p.partition_key

এখানে, partition_key কলামের উপর ভিত্তি করে ডেটা আলাদা আলাদা Worker Node-এ প্রক্রিয়া হবে।


২. Window Functions

Window Functions (যেমন ROW_NUMBER(), RANK(), DENSE_RANK(), LEAD(), LAG()) এক্সিকিউশন ফর্ম্যাটে পরিবর্তন আনার পাশাপাশি বিশেষ ধরনের অ্যালগোরিদম পরিচালনা করতে সাহায্য করে। এগুলি রো এর উপর বিভিন্ন অপারেশন প্রয়োগ করতে সহায়ক।

2.1. ROW_NUMBER() Example

আপনি যদি একটি টেবিল থেকে সর্বোচ্চ বা সর্বনিম্ন রাঙ্ক করা রেকর্ডগুলি বের করতে চান, তবে ROW_NUMBER() ব্যবহার করতে পারেন:

কোয়েরি উদাহরণ:

SELECT id, amount, ROW_NUMBER() OVER (PARTITION BY category ORDER BY amount DESC) AS rank
FROM sales

এখানে, প্রতিটি category এর জন্য amount এর উপর ভিত্তি করে ROW_NUMBER() প্রয়োগ করা হচ্ছে এবং রাঙ্কিং করা হচ্ছে।

2.2. LEAD() এবং LAG() Example

LEAD() এবং LAG() ফাংশন ব্যবহার করে আপনি পূর্ববর্তী বা পরবর্তী রো এর মান প্রাপ্তি করতে পারেন।

কোয়েরি উদাহরণ (LEAD()):

SELECT id, amount, LEAD(amount, 1) OVER (ORDER BY amount) AS next_amount
FROM sales

এটি প্রতিটি রো-এর পরবর্তী রো এর amount দেখাবে।


৩. Subqueries (Nested Queries)

Subqueries বা Nested Queries Presto তে অত্যন্ত কার্যকরী, বিশেষত যখন আপনি একটি কোয়েরির ফলাফলের উপর ভিত্তি করে আরেকটি কোয়েরি চালাতে চান।

3.1. Correlated Subqueries

Correlated Subqueries এমন সাবকোয়েরি যা বাইরের কোয়েরি থেকে মান গ্রহণ করে এবং এর মধ্যে সম্পর্ক তৈরি হয়।

কোয়েরি উদাহরণ:

SELECT id, name 
FROM products p
WHERE price > (SELECT AVG(price) FROM products WHERE category = p.category)

এখানে, বাইরের কোয়েরি category অনুযায়ী price এর গড় নির্ধারণ করবে এবং তারপরে বাইরের কোয়েরি সেই গড় মূল্যের চেয়ে বড় মূল্যগুলি নির্বাচন করবে।

3.2. Non-Correlated Subqueries

Non-Correlated Subqueries সাধারণত স্বাধীন সাবকোয়েরি যেখানে বাইরের কোয়েরির সাথে কোনো সম্পর্ক থাকে না।

কোয়েরি উদাহরণ:

SELECT id, name
FROM products
WHERE category IN (SELECT category FROM categories WHERE active = true)

এটি প্রথমে categories টেবিল থেকে সক্রিয় ক্যাটাগরি নির্বাচন করে এবং পরে সেই ক্যাটাগরির products নির্বাচিত করে।


৪. Set Operations (Union, Intersect, Except)

Presto তে Set Operations (যেমন UNION, INTERSECT, EXCEPT) ব্যবহার করে আপনি একাধিক কোয়েরির মধ্যে সম্পর্ক নির্ধারণ করতে পারেন, যেমন দুটি কোয়েরির মধ্যে সাধারণ রেকর্ড বের করা বা পার্থক্য বের করা।

4.1. UNION

UNION ব্যবহার করে আপনি দুটি কোয়েরির মধ্যে সমস্ত ইউনিক রেকর্ড বের করতে পারেন (ডুপ্লিকেট বাদ দিয়ে):

কোয়েরি উদাহরণ:

SELECT id, name FROM products WHERE category = 'Electronics'
UNION
SELECT id, name FROM products WHERE category = 'Books'

এটি Electronics এবং Books ক্যাটাগরির সমস্ত ইউনিক রেকর্ড একত্রে প্রদান করবে।

4.2. INTERSECT

INTERSECT ব্যবহার করে আপনি দুটি কোয়েরির মধ্যে সাধারণ রেকর্ডগুলো বের করতে পারেন:

কোয়েরি উদাহরণ:

SELECT id, name FROM products WHERE category = 'Electronics'
INTERSECT
SELECT id, name FROM products WHERE category = 'Books'

এটি শুধুমাত্র সেই রেকর্ডগুলো প্রদান করবে যা Electronics এবং Books উভয় ক্যাটাগরিতে রয়েছে।

4.3. EXCEPT

EXCEPT ব্যবহার করে আপনি দুটি কোয়েরির মধ্যে একক রেকর্ড যা একটি কোয়েরিতে আছে কিন্তু অন্যটিতে নেই তা বের করতে পারেন:

কোয়েরি উদাহরণ:

SELECT id, name FROM products WHERE category = 'Electronics'
EXCEPT
SELECT id, name FROM products WHERE category = 'Books'

এটি Electronics ক্যাটাগরির সমস্ত রেকর্ড প্রদান করবে যেগুলি Books ক্যাটাগরিতে নেই।


৫. Partition Pruning এবং Predicate Pushdown

Partition Pruning এবং Predicate Pushdown Presto এর পারফরম্যান্স অপটিমাইজেশনে অত্যন্ত কার্যকরী।

5.1. Partition Pruning

Presto পার্টিশনযুক্ত টেবিলের জন্য Partition Pruning ব্যবহার করে অপ্রয়োজনীয় পার্টিশন বাদ দেয় এবং শুধুমাত্র প্রয়োজনীয় পার্টিশনে কোয়েরি চালায়।

কোয়েরি উদাহরণ:

SELECT * FROM sales WHERE date = '2024-11-27'

এটি sales টেবিল থেকে শুধুমাত্র 2024-11-27 তারিখের পার্টিশন পড়বে, বাকি পার্টিশনগুলি বাদ দেবে।

5.2. Predicate Pushdown

Presto ব্যবহারকারী কোয়েরির শর্তগুলি ডেটাসোর্সের স্তরে সরাসরি প্রয়োগ করে, যা Predicate Pushdown নামে পরিচিত। এতে প্রক্রিয়া শুরু হওয়ার আগে ডেটা ফিল্টার করা হয়, যা কোয়েরির পারফরম্যান্স বৃদ্ধি করে।

কোয়েরি উদাহরণ:

SELECT * FROM products WHERE price > 100

Presto price > 100 শর্তটি সঠিক ডেটা সোর্সে পাঠাবে এবং সেখানেই ফিল্টার করবে, Presto কে পুরো টেবিল স্ক্যান করার প্রয়োজন পড়বে না।


উপসংহার

Advanced Presto Query Techniques যেমন Complex Joins, Window Functions, Subqueries, Set Operations, Partition Pruning, এবং Predicate Pushdown ব্যবহার করে আপনি Presto এর পারফরম্যান্স উন্নত করতে পারেন এবং আরও জটিল ডেটা বিশ্লেষণ করতে সক্ষম হবেন। এই কৌশলগুলি বৃহৎ ডেটাসেটের সাথে কাজ করার সময় কার্যকরী এবং স্কেলেবিলিটি নিশ্চিত করে।

Content added By

Advanced Joins এবং Nested Queries

194
194

SQL-এ Joins এবং Nested Queries (বা Subqueries) অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ টুলস, যেগুলি বিভিন্ন টেবিলের মধ্যে সম্পর্ক স্থাপন এবং জটিল প্রশ্নের উত্তর খুঁজে বের করতে সাহায্য করে। Advanced Joins এবং Nested Queries ব্যবহারের মাধ্যমে আপনি আরও জটিল ডেটা বিশ্লেষণ করতে পারবেন।


১. Advanced Joins

SQL Joins ব্যবহার করে একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয় এবং বিভিন্ন টেবিলের ডেটা একত্রে দেখা যায়। Advanced Joins হল সাধারণ Joins এর আরও উন্নত রূপ, যেখানে জটিল সম্পর্ক স্থাপন, ডেটা ফিল্টারিং এবং আরও উন্নত কাজ করা হয়।

1.1. INNER JOIN

INNER JOIN দুটি টেবিলের মধ্যে মিল থাকা রেকর্ডগুলিকে একত্রিত করে। যেসব রেকর্ড দুটি টেবিলের মধ্যে মিলিত হয়, শুধু সেগুলিই ফলাফলে আসে।

SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;

এখানে employees এবং departments টেবিলের মধ্যে department_id এবং id কলামের মধ্যে মিলিত রেকর্ড গুলি প্রদর্শিত হবে।

1.2. LEFT JOIN (বা LEFT OUTER JOIN)

LEFT JOIN মূল টেবিলের সমস্ত রেকর্ড নিয়ে আসে এবং সম্পর্কিত রেকর্ড পাওয়া না গেলে NULL দেখায়।

SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;

এখানে employees টেবিলের সমস্ত রেকর্ড দেখানো হবে, এবং departments টেবিলের সাথে সম্পর্কিত ডেটা থাকলে তা প্রদর্শিত হবে, না থাকলে NULL দেখাবে।

1.3. RIGHT JOIN (বা RIGHT OUTER JOIN)

RIGHT JOIN হল LEFT JOIN এর বিপরীত, যেখানে মূল টেবিলের ডেটা থেকে রেকর্ডগুলির পাশাপাশি সম্পর্কিত রেকর্ড পাওয়া না গেলে NULL দেখায়।

SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;

এখানে departments টেবিলের সমস্ত রেকর্ড দেখানো হবে এবং সম্পর্কিত employees টেবিলের ডেটা থাকলে তা প্রদর্শিত হবে।

1.4. FULL JOIN (বা FULL OUTER JOIN)

FULL JOIN দুটি টেবিলের সমস্ত রেকর্ড তুলে আনে, এবং যেখানে সম্পর্কিত ডেটা থাকে, সেখানে ডেটা দেখায়। যেসব রেকর্ডে মিল নেই, সেখানে NULL দেখায়।

SELECT employees.name, departments.name
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;

এখানে employees এবং departments টেবিলের সমস্ত রেকর্ড আনা হবে, যেখানে মিল থাকলে ডেটা দেখাবে এবং না থাকলে NULL দেখাবে।

1.5. CROSS JOIN

CROSS JOIN দুটি টেবিলের মধ্যে সমস্ত সম্ভব মিল তৈরি করে, অর্থাৎ একটি টেবিলের প্রতিটি রেকর্ডের সাথে অন্য টেবিলের সমস্ত রেকর্ড জোড়া তৈরি করে। এটি একে অপরের সাথে Cartesian Product তৈরি করে।

SELECT employees.name, departments.name
FROM employees
CROSS JOIN departments;

এখানে, employees এবং departments টেবিলের সমস্ত রেকর্ডের মিল তৈরি হবে।

1.6. SELF JOIN

SELF JOIN একটি টেবিলকে নিজের সাথে যোগ করার প্রক্রিয়া, যা JOIN এর মতো কাজ করে, তবে একই টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়।

SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;

এখানে employees টেবিলের মধ্যে কর্মী এবং তাদের ম্যানেজারের সম্পর্ক স্থাপন করা হচ্ছে।


২. Nested Queries (Subqueries)

Nested Queries বা Subqueries হল SQL কোয়েরির মধ্যে কোয়েরি, যা একটি মূল কোয়েরির মধ্যে অন্তর্ভুক্ত থাকে এবং ডেটার উপর আরও নির্দিষ্ট প্রশ্ন করতে সাহায্য করে। Subquery মূল কোয়েরির শর্ত হিসেবে ব্যবহৃত হয় এবং এটি সাধারণত WHERE, FROM, SELECT, বা HAVING ক্লজের মধ্যে থাকতে পারে।

2.1. Subquery in WHERE Clause

WHERE ক্লজে Subquery ব্যবহার করা হয় যখন মূল কোয়েরি কোনো শর্ত পূর্ণ করার জন্য একটি অস্থায়ী কোয়েরির ফলাফল চায়।

SELECT name, salary
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'HR');

এখানে, প্রথম কোয়েরি employees টেবিল থেকে সমস্ত কর্মীকে নির্বাচিত করবে যাদের department_id একটি সাবকোয়েরি দ্বারা পাওয়া HR বিভাগের id এর সমান।

2.2. Subquery in SELECT Clause

SELECT ক্লজে Subquery ব্যবহার করা হয় যখন আপনি মূল কোয়েরির ফলাফলের সাথে কোনো অতিরিক্ত গণনা বা ডেটা যুক্ত করতে চান।

SELECT name, 
       (SELECT MAX(salary) FROM employees WHERE department_id = 1) AS MaxSalary
FROM employees;

এখানে, প্রতিটি কর্মী এবং তাদের department_id = 1 এর জন্য MAX(salary) দেখানো হবে।

2.3. Subquery in FROM Clause

FROM ক্লজে Subquery ব্যবহার করা হয় যখন মূল কোয়েরি একটি টেবিলের মতো একটি সাবকোয়েরির ফলাফল ব্যবহার করতে চায়।

SELECT department_id, AVG(salary)
FROM (SELECT department_id, salary FROM employees WHERE salary > 50000) AS high_salary
GROUP BY department_id;

এখানে, প্রথমে একটি সাবকোয়েরি দ্বারা salary > 50000 কর্মীদের বের করা হবে এবং তারপর তাদের গড় বেতন গোনা হবে।

2.4. Correlated Subquery

Correlated Subquery হল এমন একটি সাবকোয়েরি যা মূল কোয়েরির প্রতিটি রেকর্ডের জন্য আলাদাভাবে চালিত হয়। সাবকোয়েরি মূল কোয়েরির রেকর্ডের সাথে সম্পর্কিত।

SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e1.department_id = e2.department_id);

এখানে, প্রতিটি কর্মীর বেতন তার বিভাগের গড় বেতনের থেকে বেশি কিনা তা যাচাই করা হচ্ছে।

2.5. EXISTS Subquery

EXISTS সাবকোয়েরি ব্যবহার করা হয় যখন আপনি চেক করতে চান যে কোনও রেকর্ড রয়েছে কি না।

SELECT name
FROM employees
WHERE EXISTS (SELECT 1 FROM departments WHERE employees.department_id = departments.id);

এখানে, employees টেবিলের সকল কর্মী নির্বাচন করা হবে যাদের department_id departments টেবিলে রয়েছে।


সারাংশ

  • Joins ব্যবহার করে আপনি একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন করে একটি একক ফলাফল সংগ্রহ করতে পারেন, এবং Advanced Joins ব্যবহার করে জটিল সম্পর্ক এবং আরও উন্নত ডেটা বিশ্লেষণ করতে পারেন।
  • Nested Queries (Subqueries) SQL-এ এক কোয়েরির মধ্যে আরেক কোয়েরি ব্যবহার করার মাধ্যমে ডেটার উপর আরও নির্দিষ্ট বিশ্লেষণ করতে সহায়ক।
  • Correlated Subqueries, EXISTS, এবং FROM ক্লজে Subqueries আপনাকে আরও কার্যকরভাবে ডেটা প্রক্রিয়া করতে সহায়ক হতে পারে।

এই টুলগুলো ব্যবহারে আপনি আরও জটিল প্রশ্ন এবং ডেটা বিশ্লেষণ করতে পারবেন, যা SQL কোডে দক্ষতা বৃদ্ধি করবে।

Content added By

Set Operations (Union, Intersect, Except)

207
207

Presto তে Set Operations হলো SQL কুয়েরিতে ব্যবহৃত অপারেশন, যা দুটি বা তার বেশি সিলেক্ট অ্যাকশনের মধ্যে সেট থিওরি ব্যবহার করে ডেটার মিল বা পার্থক্য নির্ধারণ করে। প্রধান তিনটি সেট অপারেশন হলো UNION, INTERSECT, এবং EXCEPT। প্রতিটি অপারেশন নির্দিষ্ট ধরনের ডেটা সংযুক্তি বা পার্থক্য প্রদর্শন করে।


১. UNION

UNION অপারেশন দুটি বা তার বেশি SQL কুয়েরির ফলাফলকে একত্রিত করে এবং ফলস্বরূপ ইউনিক (distinct) রেকর্ড প্রদান করে। যদি দুইটি সিলেক্ট স্টেটমেন্টের মধ্যে একাধিক সারি সমান হয়, তাহলে ঐ সারি কেবল একবার প্রদর্শিত হবে (distinct)।

Syntax:

SELECT column1, column2
FROM table1
UNION
SELECT column1, column2
FROM table2;
  • UNION অপারেশন দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের মধ্যে একই ধরনের ডেটা (একই কলাম সংখ্যা এবং ডেটা টাইপ) আশা করে।
  • এটি ডুপ্লিকেট রেকর্ডগুলো বাদ দিয়ে ইউনিক রেকর্ড ফলস্বরূপ প্রদান করে।

Example:

SELECT employee_id, employee_name
FROM employees_2023
UNION
SELECT employee_id, employee_name
FROM employees_2024;

এই কুয়েরিটি employees_2023 এবং employees_2024 টেবিল থেকে ইউনিক employee_id এবং employee_name ফেরত দেবে। যেগুলি যেকোনো ধরনের ডুপ্লিকেট ফলস্বরূপ থাকলে সেগুলি বাদ দেওয়া হবে।


২. UNION ALL

UNION ALL অপারেশন UNION এর মতোই, তবে এটি ডুপ্লিকেট রেকর্ডকেও অন্তর্ভুক্ত করে, অর্থাৎ দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের ফলাফল একত্রিত হবে, এবং কোনও ডুপ্লিকেট রেকর্ড বাদ দেওয়া হবে না।

Syntax:

SELECT column1, column2
FROM table1
UNION ALL
SELECT column1, column2
FROM table2;
  • UNION ALL সমস্ত রেকর্ড, যার মধ্যে ডুপ্লিকেট রেকর্ডও থাকবে, যুক্ত করে।

Example:

SELECT employee_id, employee_name
FROM employees_2023
UNION ALL
SELECT employee_id, employee_name
FROM employees_2024;

এই কুয়েরিটি employees_2023 এবং employees_2024 টেবিলের সমস্ত রেকর্ড (ডুপ্লিকেট সহ) একত্রিত করবে।


৩. INTERSECT

INTERSECT অপারেশন দুটি বা তার বেশি SQL কুয়েরির মধ্যে কমন রেকর্ড বা মিল খুঁজে বের করে। অর্থাৎ, এটি কেবলমাত্র সেই রেকর্ডগুলো ফেরত দেয় যা সমস্ত সিলেক্ট স্টেটমেন্টে উপস্থিত থাকে।

Syntax:

SELECT column1, column2
FROM table1
INTERSECT
SELECT column1, column2
FROM table2;
  • INTERSECT অপারেশন দুটি কুয়েরির মধ্যে মিলিত রেকর্ডগুলো ফেরত দেয়, এবং ডুপ্লিকেট রেকর্ড বাদ দেয়।

Example:

SELECT employee_id, employee_name
FROM employees_2023
INTERSECT
SELECT employee_id, employee_name
FROM employees_2024;

এই কুয়েরিটি শুধুমাত্র সেই employee_id এবং employee_name রেকর্ডগুলি ফেরত দেবে যা employees_2023 এবং employees_2024 উভয় টেবিলে উপস্থিত রয়েছে।


৪. EXCEPT

EXCEPT অপারেশন দুটি কুয়েরির মধ্যে পার্থক্য খুঁজে বের করে, অর্থাৎ এটি প্রথম কুয়েরির সমস্ত রেকর্ড ফেরত দেয় যেগুলি দ্বিতীয় কুয়েরিতে উপস্থিত নেই। এটি MINUS হিসেবেও পরিচিত।

Syntax:

SELECT column1, column2
FROM table1
EXCEPT
SELECT column1, column2
FROM table2;
  • EXCEPT অপারেশন প্রথম কুয়েরির সমস্ত রেকর্ড ফেরত দেয় যা দ্বিতীয় কুয়েরির মধ্যে নেই, এবং ডুপ্লিকেট রেকর্ডগুলো বাদ দেয়।

Example:

SELECT employee_id, employee_name
FROM employees_2023
EXCEPT
SELECT employee_id, employee_name
FROM employees_2024;

এই কুয়েরিটি শুধুমাত্র সেই employee_id এবং employee_name রেকর্ডগুলো ফেরত দেবে যা employees_2023 টেবিলে আছে কিন্তু employees_2024 টেবিলে নেই।


সারাংশ:

  • UNION: দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের ইউনিক রেকর্ড একত্রিত করে।
  • UNION ALL: দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের সমস্ত রেকর্ড একত্রিত করে, যার মধ্যে ডুপ্লিকেটও থাকে।
  • INTERSECT: দুটি সিলেক্ট স্টেটমেন্টের মিলিত রেকর্ডগুলো ফেরত দেয়।
  • EXCEPT: প্রথম কুয়েরির সমস্ত রেকর্ড ফেরত দেয় যা দ্বিতীয় কুয়েরির মধ্যে নেই।

এই Set Operations গুলি SQL কোয়েরির মধ্যে ডেটা সংযোগ, পার্থক্য, এবং মিল খুঁজে বের করার জন্য শক্তিশালী টুল হিসেবে ব্যবহৃত হয়।

Content added By

Window Functions এবং তাদের ব্যবহার

192
192

Window Functions হল SQL ফাংশনের একটি বিশেষ শ্রেণী যা রেকর্ডের একটি সেট বা "window" এর উপর ভিত্তি করে গণনা করে এবং প্রতিটি রেকর্ডের জন্য একটি নির্দিষ্ট আউটপুট প্রদান করে। এগুলি সাধারণভাবে লিডিং এবং ল্যাগিং (ফলক এবং পূর্ববর্তী রেকর্ডের সাথে তুলনা), রানিং টোটাল, রেটিং, এবং ডেনসিটি গণনার জন্য ব্যবহৃত হয়।

Presto তে Window Functions খুবই শক্তিশালী এবং স্কেলেবল পদ্ধতি হিসেবে কাজ করে। এটি আপনাকে একটি নির্দিষ্ট ভিউ বা উইন্ডোর মধ্যে ডেটার উপর গণনা করার সুযোগ দেয়, যা খুবই উপকারী যখন আপনি কোনও নির্দিষ্ট রেঞ্জ বা শর্তের মধ্যে কাজ করতে চান।


Window Functions এর মৌলিক ধারণা

  • Window Functions সাধারণত OVER() ক্লজ সহ ব্যবহৃত হয়। এই ক্লজটি প্রথম বা শেষ রেকর্ডের তুলনা, অথবা একটি চলন্ত গড় বা মোট বের করতে সাহায্য করে।
  • Window হল একটি নির্দিষ্ট অংশ বা শর্তাবলী যা আপনি বিশ্লেষণ করতে চান। এটি সাধারণত একটি PARTITION BY এবং ORDER BY সেগমেন্ট দ্বারা সীমাবদ্ধ থাকে।
  • PARTITION BY কলামটি উইন্ডো বা গ্রুপিং নির্ধারণ করে এবং ORDER BY উইন্ডোতে রেকর্ডগুলির সঠিক অর্ডার চিহ্নিত করে।

Window Functions এর ধরন

Presto তে বেশ কিছু জনপ্রিয় Window Functions রয়েছে, যা ডেটার উপর বিশ্লেষণ এবং গণনা করতে ব্যবহৃত হয়। এর মধ্যে অন্যতম:

  1. ROW_NUMBER()
  2. RANK()
  3. DENSE_RANK()
  4. NTILE()
  5. LEAD()
  6. LAG()
  7. FIRST_VALUE()
  8. LAST_VALUE()
  9. SUM() (over a window)
  10. AVG() (over a window)

১. ROW_NUMBER()

ROW_NUMBER() ফাংশনটি একটি রেকর্ড সেটের মধ্যে প্রতিটি রেকর্ডের জন্য একটি ইউনিক নম্বর প্রদান করে, এটি প্রতিটি রেকর্ডকে একটি নির্দিষ্ট ক্রমে নংকিত করে।

ব্যবহার:

SELECT name, salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;

এই কোয়েরিটি কর্মচারীদের বেতনের ভিত্তিতে তাদেরকে একটি ক্রমবদ্ধ নম্বর প্রদান করবে।


২. RANK()

RANK() ফাংশনটি রেকর্ডগুলির মধ্যে রেঙ্কিং প্রদান করে। তবে, এটি একটি সাধারণ নম্বর নিকালবে, যেখানে একাধিক রেকর্ড একই রেঙ্ক শেয়ার করতে পারে।

ব্যবহার:

SELECT name, salary,
       RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

এটি কর্মচারীদের বেতনের ভিত্তিতে তাদের রেঙ্ক প্রদান করবে, তবে দুটি কর্মচারীর যদি সমান বেতন থাকে, তারা সমান রেঙ্ক পাবে এবং পরবর্তী রেঙ্কটি এক পদস্খলিত হবে।


৩. DENSE_RANK()

DENSE_RANK() ফাংশনটি RANK() এর মতো কাজ করে, তবে এটি দুটি বা তার বেশি সমান রেকর্ডের জন্য রেঙ্কের মধ্যে গ্যাপ না রেখে সন্নিবেশ ঘটায়।

ব্যবহার:

SELECT name, salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

এই কোয়েরি কর্মচারীদের বেতনের ভিত্তিতে রেঙ্ক প্রদান করবে, তবে যদি দুটি কর্মচারীর সমান বেতন থাকে, তারা একই রেঙ্ক পাবে এবং পরবর্তী রেঙ্কটি ধারাবাহিকভাবে প্রদর্শিত হবে।


৪. NTILE()

NTILE() ফাংশনটি রেকর্ডগুলিকে একটি নির্দিষ্ট সংখ্যক ভাগে ভাগ করে দেয় (যেমন 4টি ভাগে ভাগ করা), এবং প্রতিটি ভাগের জন্য একটি নং প্রদান করে।

ব্যবহার:

SELECT name, salary,
       NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;

এই কোয়েরিটি কর্মচারীদের বেতন অনুযায়ী তাদের চারটি সমান ভাগে ভাগ করবে এবং প্রতিটি ভাগের জন্য একটি সংখ্যা প্রদান করবে।


৫. LEAD()

LEAD() ফাংশনটি বর্তমান রেকর্ডের পরে থাকা রেকর্ডের মান ফেরত দেয়। এটি ব্যবহার করে আপনি বর্তমান রেকর্ডের তুলনায় পরবর্তী রেকর্ডের মান বিশ্লেষণ করতে পারেন।

ব্যবহার:

SELECT name, salary,
       LEAD(salary, 1) OVER (ORDER BY salary DESC) AS next_salary
FROM employees;

এই কোয়েরিটি কর্মচারীর বর্তমান বেতন এবং পরবর্তী কর্মচারীর বেতন প্রদান করবে।


৬. LAG()

LAG() ফাংশনটি LEAD() এর বিপরীত কাজ করে, যেখানে এটি বর্তমান রেকর্ডের পূর্ববর্তী রেকর্ডের মান ফেরত দেয়।

ব্যবহার:

SELECT name, salary,
       LAG(salary, 1) OVER (ORDER BY salary DESC) AS prev_salary
FROM employees;

এই কোয়েরিটি কর্মচারীর বর্তমান বেতন এবং তার আগের কর্মচারীর বেতন প্রদান করবে।


৭. FIRST_VALUE()

FIRST_VALUE() ফাংশনটি একটি উইন্ডো বা অংশের মধ্যে প্রথম মান প্রদান করে।

ব্যবহার:

SELECT name, salary,
       FIRST_VALUE(salary) OVER (ORDER BY salary DESC) AS highest_salary
FROM employees;

এটি কর্মচারীদের মধ্যে প্রথম মান (সর্বোচ্চ বেতন) প্রদান করবে, যেহেতু বেতন ডেসক্রিং অর্ডারে সজ্জিত।


৮. LAST_VALUE()

LAST_VALUE() ফাংশনটি একটি উইন্ডো বা অংশের মধ্যে সর্বশেষ মান প্রদান করে।

ব্যবহার:

SELECT name, salary,
       LAST_VALUE(salary) OVER (ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lowest_salary
FROM employees;

এটি কর্মচারীদের মধ্যে সর্বশেষ মান (নিম্নতম বেতন) প্রদান করবে।


৯. SUM() এবং AVG() Window Functions হিসেবে

SUM() এবং AVG() ফাংশনগুলি Window Functions হিসেবেও ব্যবহার করা যায়, যেখানে আপনি নির্দিষ্ট উইন্ডো বা অংশের উপর সন্নিবেশ ও গড় হিসাব করতে পারেন।

ব্যবহার:

SELECT name, salary,
       SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS department_salary_total,
       AVG(salary) OVER (PARTITION BY department) AS department_avg_salary
FROM employees;

এই কোয়েরিটি প্রতিটি বিভাগের জন্য মোট বেতন এবং গড় বেতন হিসাব করবে।


সারাংশ

Window Functions SQL এর একটি শক্তিশালী টুল যা আপনাকে একাধিক রেকর্ডের উপর ভিত্তি করে বিভিন্ন ধরনের বিশ্লেষণ এবং গণনা করার সুযোগ দেয়। এগুলি বিশ্লেষণাত্মক ফাংশন যেমন RANK(), LEAD(), LAG(), এবং SUM() সহ ব্যবহার করা হয়। Presto তে Window Functions ব্যবহার করে আপনি কার্যকরী এবং দক্ষ ডেটা বিশ্লেষণ করতে পারেন, যা বিশেষত বড় ডেটাসেট বিশ্লেষণের জন্য অত্যন্ত কার্যকরী।

Content added By

Query Parallelization এবং Performance Improvements

184
184

Presto একটি ডিস্ট্রিবিউটেড SQL কোয়েরি ইঞ্জিন, যা বড় ডেটাসেটের উপর দ্রুত এবং স্কেলযোগ্য কোয়েরি এক্সিকিউশন নিশ্চিত করতে সক্ষম। Query Parallelization এবং Performance Improvements হল Presto এর দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা একে উচ্চ পারফরম্যান্স এবং কার্যকরী করে তোলে।

এই টিউটোরিয়ালে আমরা Query Parallelization এবং Performance Improvements এর মূল ধারণা, কৌশল, এবং প্রক্রিয়া আলোচনা করব।


১. Query Parallelization in Presto

Query Parallelization হল একাধিক প্রসেস বা থ্রেডে কোয়েরি এক্সিকিউশন ভাগ করা, যাতে ডেটা প্রক্রিয়াকরণের গতি বৃদ্ধি পায়। Presto ডিস্ট্রিবিউটেড আর্কিটেকচারের মাধ্যমে কোয়েরির কাজ 多个 worker nodes এর মধ্যে বিভক্ত করে এবং এইভাবে প্রতিটি worker node তার নির্দিষ্ট কাজের অংশ সম্পন্ন করে।

কিভাবে Presto Query Parallelization কাজ করে?

  1. Query Breakdown and Distribution:
    • Presto কোয়েরি পরিকল্পনা তৈরি করার পরে, Coordinator Node কোয়েরিটি বিভিন্ন অংশে বিভক্ত করে।
    • একাধিক Worker Node এ কাজটি বিতরণ করা হয়। প্রতিটি worker node একটি নির্দিষ্ট কাজ সম্পন্ন করে এবং তার ফলাফল Coordinator-এ পাঠায়।
  2. Data Partitioning:
    • Presto কোয়েরির ডেটা পার্টিশন করে। উদাহরণস্বরূপ, GROUP BY, JOIN, বা ORDER BY অপারেশনগুলোতে ডেটা ভাগ করা হয় যাতে প্রতিটি অংশ পৃথকভাবে প্রক্রিয়া করা যায়।
    • Shuffling: কিছু ক্ষেত্রে ডেটা বিভিন্ন Worker Node এর মধ্যে শিফট হতে পারে (যেমন, JOIN বা GROUP BY অপারেশনের জন্য)।
  3. Parallel Execution:
    • Query Execution Plan অনুযায়ী, Presto বিভিন্ন স্টেপকে একাধিক worker node-এ প্যারালালভাবে এক্সিকিউট করে।
    • In-memory processing: ডেটার প্রক্রিয়াকরণ মেমরিতে করা হয়, যা এক্সিকিউশন গতি বাড়ায়।

Presto Query Parallelization Example:

ধরা যাক, একটি কোয়েরি GROUP BY এবং JOIN অপারেশন নিয়ে কাজ করছে, Presto এটি প্রতিটি worker node-এ আলাদাভাবে ভাগ করবে, এবং প্রতিটি অংশে পৃথকভাবে কাজ হবে।

SELECT customer_id, SUM(amount)
FROM hive.default.orders
GROUP BY customer_id;

এই কোয়েরি যদি বিশাল ডেটাসেটের উপর চলে, Presto ঐ ডেটাসেটটি Worker Node-এ ভাগ করে চালাবে। এইভাবে, প্রতিটি Worker Node আলাদা আলাদা গ্রুপের জন্য SUM(amount) গণনা করবে, এবং শেষে Coordinator Node সেগুলিকে একত্রিত করবে।


২. Performance Improvements in Presto

Presto-তে পারফরম্যান্স উন্নত করার জন্য কিছু অপ্টিমাইজেশন কৌশল এবং বৈশিষ্ট্য রয়েছে যা Query Execution দ্রুত করতে সাহায্য করে। নিচে কিছু গুরুত্বপূর্ণ কৌশল এবং অপ্টিমাইজেশন টেকনিক আলোচনা করা হলো:

১. Predicate Pushdown

Predicate Pushdown হল একটি অপ্টিমাইজেশন কৌশল যেখানে কোয়েরির WHERE ক্লজে থাকা শর্তগুলি, যতটা সম্ভব, ডেটা সোর্সে (যেমন Hive, MySQL) প্রক্রিয়া করা হয়। এতে কম ডেটা প্রসেস করা হয় এবং পরবর্তীতে Presto-তে কম ডেটা লোড হয়।

উদাহরণ:

SELECT * FROM hive.default.orders WHERE order_status = 'shipped';

এই কোয়েরি যখন Presto Hive এর সাথে চালানো হয়, তখন WHERE শর্তটি Hive স্তরে প্রক্রিয়া করা হয়, ফলে কম ডেটা Presto-তে আনা হয়।

২. Column Pruning

Column Pruning হল একটি কৌশল যেখানে শুধুমাত্র প্রয়োজনীয় কলামগুলি নির্বাচিত হয়। এতে অপ্রয়োজনীয় কলামগুলি লোড না করে, কোয়েরি দ্রুত সম্পন্ন হয়।

উদাহরণ:

SELECT order_id, customer_id FROM hive.default.orders;

এই কোয়েরিতে শুধুমাত্র order_id এবং customer_id কলামগুলি নির্বাচিত হচ্ছে, তাই Presto অন্যান্য কলামগুলো লোড করবে না।

৩. Join Optimization

Presto Join Optimization-এর মাধ্যমে দ্রুত ফলাফল প্রদান করতে পারে। বিভিন্ন ধরনের জয়েন অপারেশন (যেমন Hash Join, Merge Join, Nested Loop Join) নির্বাচন করে, Presto দ্রুত কোয়েরি এক্সিকিউশন করতে সক্ষম হয়।

  • Broadcast Join: ছোট টেবিলগুলির সাথে বড় টেবিল জয়েন করা হলে Broadcast Join ব্যবহার করা হয়, যাতে ছোট টেবিলটি সমস্ত Worker Node-এ পাঠানো যায়।
  • Partitioned Join: বড় টেবিলের জন্য Partitioned Join ব্যবহার করা হয়, যা ডেটা পার্টিশনিংয়ের মাধ্যমে দ্রুত কাজ করে।

৪. Query Caching

Presto কোয়েরি ফলাফলগুলো ক্যাশে করতে পারে, যাতে পুনরায় একই কোয়েরি চালানোর সময় দ্রুত ফলাফল পাওয়া যায়। Presto-এর ক্যাশে সিস্টেম তাতে সাহায্য করে যখন একই কোয়েরি পুনরায় চালানো হয়।

৫. Memory and CPU Optimization

Presto তে মেমরি এবং সিপিইউ ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ। Memory management এবং CPU optimization করতে, Presto query.max-memory-per-node এবং query.max-total-memory-per-node প্যারামিটার ব্যবহার করতে পারে, যাতে কোয়েরি এক্সিকিউশনের সময় বেশি মেমরি ব্যবহার না হয়।

config.properties কনফিগারেশন:

query.max-memory=5GB
query.max-memory-per-node=1GB

৬. Parallel Query Execution with Dynamic Workload Management

Presto ক্লাস্টারে বিভিন্ন কোয়েরি একসাথে প্যারালালভাবে এক্সিকিউট করা হয়, এবং Dynamic Workload Management (DWM) ব্যবহার করে, কোয়েরির জন্য পর্যাপ্ত রিসোর্স বরাদ্দ করা হয়। এতে প্রতিটি কোয়েরি সঠিকভাবে সম্পন্ন হয় এবং একে অপরের উপর প্রভাব ফেলে না।

৭. Data Partitioning

Presto Hive বা অন্যান্য ডেটা সোর্সের জন্য partitioning ব্যবহার করে ডেটা ভাগ করা হয়। এটি সঠিক পার্টিশন থেকে ডেটা ফিল্টার এবং প্রসেস করার মাধ্যমে পারফরম্যান্স উন্নত করে।


৩. Presto Performance Tuning

Presto-এর পারফরম্যান্স টিউনিং করা যেতে পারে বিভিন্ন কৌশল ও অপ্টিমাইজেশন টেকনিক ব্যবহারের মাধ্যমে:

  • Query Optimizer ব্যবহার করে, Presto কোয়েরি এক্সিকিউশন পরিকল্পনা অপ্টিমাইজ করতে পারে।
  • Cost-based Query Optimizer ব্যবহার করে কোয়েরির খরচ কমানো যেতে পারে এবং দ্রুত ফলাফল পাওয়া যায়।
  • Memory Management এবং Concurrency Control টিউনিং করে বিভিন্ন কোয়েরি এক্সিকিউশনকে দক্ষভাবে পরিচালনা করা যায়।

সারাংশ

  • Query Parallelization Presto-তে প্যারালাল এক্সিকিউশন নিশ্চিত করতে সাহায্য করে, যাতে ডেটা দ্রুত প্রক্রিয়া করা যায়।
  • Performance Improvements কৌশলগুলি, যেমন Predicate Pushdown, Column Pruning, Join Optimization, এবং Memory Management, কোয়েরি এক্সিকিউশন দ্রুত করতে সাহায্য করে।
  • Dynamic Workload Management এবং Data Partitioning ব্যবহার করে Presto ক্লাস্টারের কর্মক্ষমতা উন্নত করা যায়।

এই কৌশলগুলো আপনাকে Presto কোয়েরি এক্সিকিউশনের পারফরম্যান্স উন্নত করতে এবং বৃহৎ ডেটাসেটের উপর দ্রুত বিশ্লেষণ করতে সহায়ক হবে।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion
;